import 'base_generator.dart';

/// 控制器生成器
class ControllerGenerator extends BaseGenerator {
  static void generate(String name, Map<String, dynamic> options) {
    if (!BaseGenerator.isValidName(name)) {
      BaseGenerator.printError('控制器名称格式不正确: $name');
      return;
    }

    final String moduleName = options['module'] ?? '';
    final String type = options['type'] ?? 'getx'; // getx | base

    final String className = BaseGenerator.toPascalCase(name);
    final String fileName = BaseGenerator.toSnakeCase(name);
    final String modulePath = BaseGenerator.getModulePath(moduleName);
    
    // 创建控制器目录
    final String controllerDir = '$modulePath/presentation/controllers';
    BaseGenerator.createDirectoryIfNotExists(controllerDir);
    
    // 生成控制器文件
    final String controllerPath = '$controllerDir/${fileName}_controller.dart';
    final String controllerContent = _generateControllerContent(className, type);
    
    BaseGenerator.writeFile(controllerPath, controllerContent);
    
    BaseGenerator.printSuccess('控制器', className, controllerPath);
    _printUsageInstructions(className, type);
  }

  static String _generateControllerContent(String className, String type) {
    switch (type.toLowerCase()) {
      case 'base':
        return _generateBaseControllerContent(className);
      case 'getx':
      default:
        return _generateGetxControllerContent(className);
    }
  }

  static String _generateGetxControllerContent(String className) {
    return BaseGenerator.generateFileHeader(
      className,
      '${className} - 基于GetX的控制器'
    ) + '''
import 'package:get/get.dart';

class $className extends GetxController {
  // 响应式状态变量
  final _isLoading = false.obs;
  final _errorMessage = ''.obs;
  final _data = <String>[].obs;
  
  // Getter方法
  bool get isLoading => _isLoading.value;
  String get errorMessage => _errorMessage.value;
  List<String> get data => _data;
  bool get hasError => _errorMessage.value.isNotEmpty;
  bool get hasData => _data.isNotEmpty;

  @override
  void onInit() {
    super.onInit();
    _initController();
  }

  @override
  void onReady() {
    super.onReady();
    // 页面准备完成后执行
  }

  void _initController() {
    // 初始化控制器
    loadData();
  }

  /// 加载数据
  Future<void> loadData() async {
    try {
      _setLoading(true);
      _clearError();
      
      // 模拟数据加载
      await Future.delayed(const Duration(seconds: 1));
      
      // 模拟数据
      _data.assignAll(['项目1', '项目2', '项目3']);
      
    } catch (e) {
      _setError('加载数据失败: \$e');
    } finally {
      _setLoading(false);
    }
  }

  /// 刷新数据
  Future<void> refreshData() async {
    _data.clear();
    await loadData();
  }

  /// 添加项目
  void addItem(String item) {
    if (item.trim().isNotEmpty) {
      _data.add(item);
      Get.snackbar('成功', '添加项目: \$item');
    }
  }

  /// 删除项目
  void removeItem(int index) {
    if (index >= 0 && index < _data.length) {
      final removedItem = _data.removeAt(index);
      Get.snackbar('成功', '删除项目: \$removedItem');
    }
  }

  /// 清除所有数据
  void clearData() {
    _data.clear();
    Get.snackbar('提示', '已清除所有数据');
  }

  /// 设置加载状态
  void _setLoading(bool loading) {
    _isLoading.value = loading;
  }

  /// 设置错误信息
  void _setError(String error) {
    _errorMessage.value = error;
    if (error.isNotEmpty) {
      Get.snackbar('错误', error);
    }
  }

  /// 清除错误信息
  void _clearError() {
    _errorMessage.value = '';
  }

  /// 重试操作
  void retry() {
    _clearError();
    loadData();
  }

  @override
  void onClose() {
    // 清理资源
    super.onClose();
  }
}
''';
  }

  static String _generateBaseControllerContent(String className) {
    return BaseGenerator.generateFileHeader(
      className,
      '${className} - 基于BaseController的控制器'
    ) + '''
import 'package:get/get.dart';
import '../../../core/controllers/base_controller.dart';

class $className extends BaseController {
  // 本地状态变量
  List<String> _data = [];
  String _selectedItem = '';
  
  // Getter方法
  List<String> get data => _data;
  String get selectedItem => _selectedItem;
  bool get hasData => _data.isNotEmpty;
  bool get hasSelection => _selectedItem.isNotEmpty;

  @override
  void onInit() {
    super.onInit();
    _initController();
  }

  void _initController() {
    // 初始化控制器
    loadData();
  }

  /// 加载数据
  Future<void> loadData() async {
    try {
      setLoading(true);
      clearError();
      
      // 模拟数据加载
      await Future.delayed(const Duration(seconds: 1));
      
      // 模拟数据
      _data = ['项目1', '项目2', '项目3'];
      
      // 通知UI更新
      update();
      
    } catch (e) {
      setError('加载数据失败: \$e');
    } finally {
      setLoading(false);
    }
  }

  /// 刷新数据
  Future<void> refreshData() async {
    _data.clear();
    _selectedItem = '';
    await loadData();
  }

  /// 选择项目
  void selectItem(String item) {
    _selectedItem = item;
    update();
    Get.snackbar('选择', '已选择: \$item');
  }

  /// 添加项目
  void addItem(String item) {
    if (item.trim().isNotEmpty) {
      _data.add(item);
      update();
      Get.snackbar('成功', '添加项目: \$item');
    }
  }

  /// 删除项目
  void removeItem(int index) {
    if (index >= 0 && index < _data.length) {
      final removedItem = _data.removeAt(index);
      if (_selectedItem == removedItem) {
        _selectedItem = '';
      }
      update();
      Get.snackbar('成功', '删除项目: \$removedItem');
    }
  }

  /// 清除选择
  void clearSelection() {
    _selectedItem = '';
    update();
  }

  /// 清除所有数据
  void clearData() {
    _data.clear();
    _selectedItem = '';
    update();
    Get.snackbar('提示', '已清除所有数据');
  }

  /// 重试操作
  void retry() {
    clearError();
    loadData();
  }

  @override
  void onClose() {
    // 清理资源
    super.onClose();
  }
}
''';
  }

  static void _printUsageInstructions(String className, String type) {
    print('\n📋 使用说明:');
    print('1. 在页面中使用控制器:');
    print('   final controller = Get.put($className());');
    print('');
    print('2. 在其他地方获取控制器:');
    print('   final controller = Get.find<$className>();');
    print('');
    
    if (type == 'getx') {
      print('3. 响应式UI更新 (GetX):');
      print('   Obx(() => Text(controller.data.length.toString()))');
      print('');
      print('4. 构建器模式:');
      print('   GetBuilder<$className>(');
      print('     builder: (controller) => YourWidget(),');
      print('   )');
    } else {
      print('3. 构建器模式 (BaseController):');
      print('   GetBuilder<$className>(');
      print('     builder: (controller) => YourWidget(),');
      print('   )');
    }
  }
}
''';
  }
}